perm filename JUSTX.F4[NEW,LCS] blob sn#709240 filedate 1983-05-03 generic text, type T, neo UTF8
00100	C 3/19/83  ******** SUBROUTINE JUSTFY, ROOM, JSPACE *****
00200		SUBROUTINE JUSTFY(JLP,ITEM,NPW,NO,RN,RSTFAC,R2,R4,R5)
00300	CX	SUBROUTINE JUSTFY(JLP,R,IR,NO,NP,RN,RSTFAC,R2,R4,R5,R6,R8,R9)
00400	COPYRIGHT 1983 BY LELAND SMITH
00500	CC	COMMON/RINP/XPS(250),NP(250),NQ(400),XPR(250)
00600		COMMON /JST/ N,XP(400),XPL(400),XPS(400),NP(400),XPR(400)
00700		DIMENSION RN(1),NO(1),RSTFAC(0/1),NPW(1)
00800	C DATA FOR SPACE FOR SOME ITEMS
00900	C	DATA RNT/3.0/,RST/3.0/,CLF/6.5/,BAR/1.0/,SIGL/2.5/,SIGR/1.0/
01000	C	1,ACCI/3.0/,RLDG/2.0/,TSR/4.0/,TSL/2.0/,TTSR/6.0/,TTSL/3.0/
01100		DATA RNT/3.6/,RST/3.0/,CLF/6.5/,BAR/1.0/,SIGL/2.5/,SIGR/1.0/
01200		1,ACCI/2.5/,RLDG/1.6/,TSR/4.0/,TSL/2.0/,TTSR/6.0/,TTSL/3.0/
01300		1,HALF/3.9/,WHOL/4.3/,DBW/4.8/,DOT/2.2/,SIG/2.0/,SIGN/2.0/
01400		1,BARR/1.3/
01500	C RNT=NOTE, RST=REST, TSR=METER RIGHT, TTSR=DBL DIGIT METER, ETC.
01600	C RLDG=LEDGER LINE, SIGR=KEY SIG. RT, SIG=SIZE OF ACCI IN KSIG
01700	C SIGN=SPACE FROM KSIG TO NOTE, BARR=EXTRA FOR NOTE TO RT OF BAR
01800	
01900	C JLP= TOP STAFF NUM.
02000	C R2=THIS STAFF NUM.  R4=LEFT EDGE, R5=RIGHT EDGE.
02100	
02200		RJLP=JLP
02300		NN=0
02400	C BEGIN SETUP OF NEEDED POINTERS
02500		DO 50 K=1,ITEM
02600		L=NPW(K)
02700	C POINTER TO RN ARRAY
02800		IF(R2.GT.RJLP)GO TO 55
02900	C JUMP IF LOOKING AT ALL STAVES
03000		IF(R2.NE.RN(L+2))GO TO 50
03100	C SKIP IF NOT RIGHT STAFF
03200	55	M=RN(L+1)
03300	C CODE NUM.
03400		IF(M.GT.4.AND.M.LT.17)GO TO 50
03500	C LOOK AT NOTES, RESTS, CLEFS, BARS, KSIG, METER.
03600		RL=RN(L)
03700	C  WORD COUNT
03800		RR3=RN(L+3)
03900	C HORIZ. POSITION
04000		IF(RR3+0.1.LT.R4.OR.RR3.GT.R5)GO TO 50
04100	C JUMP IF NOT IN BOUNDS
04200		GO TO(51,52,53,54)M
04300	C NOW CODE 17 OR 18
04400		GO TO 59
04500	51	IF(RN(L+9).LT.0)GO TO 50
04600	C NEED WDCNT CHECK HERE?   JUMP IF NON-IMPORTANT NOTE
04700	59	NN=NN+1
04800		NP(NN)=L
04900		IF(NN.LE.250)GO TO 50
05000	C TOO MUCH DATA?
05100		WRITE(5,69)NN
05200		GO TO 57
05300	69	FORMAT(' ***** TOO MUCH.  JUSTIFY LIMIT = ',I3)
05400	52	RR6=RN(L+6)
05500		RR7=RN(L+7)
05600		RR8=RN(L+8)
05700		IF(RL.GE.4.0.AND.RR6.LT.0)GO TO 50
05800		IF(RL.GE.5.0.AND.RR7.LT.0)GO TO 50
05900	C SKIP INVISIBILE RESTS AND RESTS WITH NEG. RHY.
06000		IF(RL.GE.6.0.AND.RR8.NE.0)GO TO 50
06100	C RR8<0=CENTERED WHOLE REST - ASSUMES NO NEED TO JUSTIFY.
06200		GO TO 59
06300	53	IF(RL.LT.3.0)GO TO 59
06400		IF(RN(L+5).LE.4.0)GO TO 59
06500	C FOUND TRUE CLEF (0=TREB, 1=BASS, 2=ALT, 3=TEN, 4=PERC.)
06600		GO TO 50
06700	54	IF(RL.GT.3.OR.RN(L+4).LT.0)GO TO 50
06800	C IF P4.LT.0 THEN IT'S AN INVISIBLE BAR.
06900		GO TO 59
07000	CC  FOR REPEAT BAR WDCNT IS 3 -- 10/77 444	IF(RL.GT.2)GO TO 2
07100	C  SHOULD CHECK ON BAR LINES NO MATTER WHICH STAFF
07200	50	CONTINUE
07300	
07400	C FIRST SORT BY STAFF NUM. AND HORIZ. POS.
07500	57	N=2
07600	61	M=NP(N)+2
07700		KK=N-1
07800		JJ=NP(KK)+2
07900		Z=RN(M)*1000.0+RN(M+1)
08000		X=RN(JJ)*1000.0+RN(JJ+1)
08100		IF(Z.GE.X)GO TO 62
08200	COMPARE STAFF NUMS.*1000 + HORIZ. POS.
08300		M=NP(N)
08400		NP(N)=NP(KK)
08500		NP(KK)=M
08600	C EXCHANGE POINTERS AND TRY AGAIN
08700		IF(N.GT.2)N=KK
08800		GO TO 61
08900	62	N=N+1
09000		IF(N.LE.NN)GO TO 61
09100	C NOW ALL SORTED BY STAFF NUM. AND POS.
09200		XP(1)=R4
09300		XPL(1)=0
09400		XPR(1)=0
09500		XPS(1)=-1.0
09600	C SET LEFT EDGE OF JUSTIFY AREA
09700		N=2
09800		DO 200 K=1,NN
09900		L=NP(K)
10000		RL=RN(L)
10100	C  RL=WDCNT-2
10200		RA=RN(L+1)
10300	C  RA=CODE NUM.
10400		RR3=RN(L+3)
10500	C  RR3=POSITION(P3)
10600		RR2=RN(L+2)
10700	C  RR2=STAFF NUM. OF THIS ITEM
10800		RY=1.
10900	C BASIC SIZE FACTOR
11000		PL=0
11100		RR5=RN(L+5)
11200	C  RR5=PARAM 5    RR6=P6   RW=P4 
11300		RR6=RN(L+6)
11400	78	RR4=RN(L+4)
11500	C  RR4=HEIGHT-MINI(P4)
11600		M=RA
11700		GO TO(1,2,3,4)M     
11800	C  LOOKS AT NOTES,RESTS,CLEFS,BAR LINES,KSIGS,METERS.
11900	
12000		IF(M.EQ.18)GO TO 18
12100		GO TO 17
12200	
12300	C***** NOTES ******
12400	1	RR7=RN(L+7)
12500	C RR7=P7  DOTS, TAILS
12600		RC=ABS(RR4)
12700		RR4=AMOD(RR4,100.0)
12800		IF(RR4.GT.80.0)RR4=RR4-100.0
12900		IF(RC.LT.80.)GO TO 19
13000		IF(RC.LT.180.)RY=.6
13100	C  FOUND A MINI-NOTE
13200	
13300	CC19	PL=1.
13400	C SPACE NEEDED TO LEFT
13500	19	PR=RNT
13600	C SPACE NEEDED TO RIGHT (SEE DATA)
13700		PRR=0
13800	C STORES EXTRA SPACE TO RIGHT
13900		PLL=0
14000	C STORES EXTRA SPACE TO LFT
14100		
14200	10	IF(RR7.EQ.0)GO TO 12
14300	C TAIL ON NOTE?  (CHECK FOR HALF, WHOLE NOTES, RR6<0)
14400		RR=AMOD(RR7,10.0)
14500		IF(RR.LE.0.OR.RR6.LT.0)GO TO 11
14600		IF(RR5.LT.10.0.OR.RR5.GE.20.0)GO TO 11
14700	C SKIP IF NO STEM OR STEM DOWN
14800		PRR=1.8
14900	C ADD ROOM FOR TAIL
15000		
15100	11	KK=RR7/10
15200		PX=DOT*KK
15300	C SPACE FOR DOT(S)
15400		PX=PX+AMOD(RR7,1.0)*10.0
15500	C ADD SOME IF DOTS SPACED EXTRA TO RIGHT (E.G. 1.23=2.3 SPACES TO RT.)
15600		IF(PX.GT.PRR)PRR=PX
15700		IF(RR7.GE.10.0)GO TO 1012
15800	C NOTE HAS DOT, NO SPACE NEEDED FOR LEDGER LINE.
15900		IF(RR5.GE.10.0.AND.RR5.LT.20.0.AND.AMOD(RR7,10.0).GE.1.0)
16000		1 GO TO 1012
16100	C SKIP IF NOTE HAS TAIL ON STEM UP.
16200	12	IF(RR4.LT.13.0.AND.RR4.GT.1.0)GO TO 1012
16300	C IF LEDGER LINES ADD SPACE TO RIGHT
16400		 IF(PRR.GE.RLDG)GO TO 1012
16500	C ALREADY ENOUGH SPACE FOR LEDGER LINE EXTENSION - SKIP NEXT
16600		JJ=0
16700	C NOW FIND NEXT CLOSEST NOTE TO RIGHT ON THIS STAFF.
16800		X=RR4-13.0
16900		KK=K+1
17000	1000	IF(KK.GT.NN)GO TO 1012
17100		J=NP(KK)
17200		IF(RN(J+1).NE.1.0)GO TO 1012
17300	C JUMP IF NEXT IS NOT NOTE
17400		IF(RN(J+2).NE.RR2)GO TO 1012
17500	C JUMP IF NOT ON SAME STAFF
17600		IF(RN(J+3)-RR3.GT.0.1)GO TO 1003
17700	C JUMP IF NEXT NOTE NOT SAME POS.
17800		KK=KK+1
17900		GO TO 1000
18000	1003	Y=RN(J+3)
18100	C SAVE POS OF NEXT NOTE
18200	1006	IF(AMOD(RN(J+5),10.0).GE.1.0)GO TO 1012
18300	C JUMP IF NEXT NOTE HAS ACCI.   ENOUGH ROOM ALREADY
18400		Z=AMOD(RN(J+4),100.0)
18500	C HEIGHT OF NOTE
18600		IF(X.GE.0)GO TO 1001
18700	C JUMP IF PREV. NOTE WAS ABOVE STAFF
18800		IF(Z.LE.1.0)GO TO 1002
18900	C JUMP IF THIS NOTE AND LAST BELOW STAFF
19000		GO TO 1004
19100	1001	IF(Z.LT.13.0)GO TO 1004
19200	1002	PRR=RLDG
19300	C ADD SPACE TO RIGHT FOR LEDGER LINE
19400		GO TO 1012
19500	1004	X=RN(J+3)
19600		IF(KK.EQ.NN)GO TO 1012
19700	C JUMP IF NO MORE ITEMS
19800		KK=KK+1
19900		J=NP(KK)
20000		IF(RN(J+2).NE.RR2)GO TO 1012
20100		IF(RN(J+1).NE.1.0)GO TO 1012
20200		IF(RN(J+3)-Y.LE.0.1)GO TO 1006
20300	C GO BACK AND TRY AGAIN IF NEXT NOTE IS PART OF CHORD
20400	
20500	1012	RR=AMOD(RR5,10.0)
20600	C ANY ACCIDENTALS?
20700		IF(RR.EQ.0)GO TO 13
20800		PLL=ACCI
20900		IF(IFIX(RR).EQ.4)PLL=ACCI+2.0
21000	C RR=4 = DOUBLE FLAT
21100	CCC	PLL=3.0
21200	CCC	IF(IFIX(RR).EQ.4)PLL=5.0
21300		PLL=PLL+AMOD(RR5,1.0)*10.0
21400	C INCREASE IF ACCI. SPACED TO LEFT. (E.G. 12.21 =2.1 SPACES TO LEFT)
21500	
21600	13	IF(ABS(RR6).LT.1.0)GO TO 14
21700	C LOOK FOR HALF NOTES, WHOLE NOTES, NOTES ON WRONG SIDE OF STEM.
21800		KK=0
21900		IF(RR6.GT.0)GO TO 130
22000	C NOW IT'S A WHITE NOTE
22100		PR=HALF
22200	C SEE DATA FOR SPACE FOR HALFNOTE
22300		KK=IFIX(AMOD(RR7,10.0))
22400	C GET RT. DIGIT IN P7
22500		IF(KK.EQ.1)PR=WHOL
22600		IF(KK.EQ.2)PR=DBW
22700	C =1=WHOLENOTE, =2=DOUBLE WHOLENOTE
22800		IF(RR6.GT.-10.0)GO TO 14
22900	C NOW NOTE ON WRONG SIDE OF STEM
23000	130	AR=2.5
23100		IF(KK.EQ.1)AR=3.0
23200		IF(KK.EQ.2)AR=3.5
23300		IF(ABS(RR6).GE.20.0)GO TO 135
23400	C NOW NOTE TO RIGHT OF STEM
23500		PRR=PRR+AR
23600		GO TO 14
23700	135	PLL=PLL+AR
23800	C ADD SPACE TO LEFT IF NOTE ON LEFT SIDE OF STEM
23900	
24000	14    	PR=(PR+PRR)*RY
24100		PL=(PL+PLL)*RY
24200		
24300		IF(RL.LT.8)GO TO 700
24400	C JUMP IF THERE IS NOT P10 TO LOOK AT
24500		IF(RN(L+10).EQ.0)GO TO 700
24600		RR2=RR2+1
24700	CC	RW=RN(L+10)
24800	C PUT P10 INTO RW
24900		IF(RN(L+10).LT.2.0)RR2=RR2-2.
25000	C NOW STAFF # IS SET TO WHERE NOTE REALLY IS.
25100		GO TO 700
25200	
25300	C***** RESTS *****
25400	2	PR=RST
25500		IF(RL.GE.5.0)PR=PR+RR6*2.0
25600	C RR6=DOTS
25700	CC	PL=1.0
25800		GO TO 700
25900		
26000	3	IF(RL.GE.2.AND.RR4.GE.100.0)RY=.85
26100		PR=CLF*RY
26200		GO TO 700
26300	
26400	C4	PL=0.5
26500	4	PL=1.0
26600		PR=BAR
26700	C PL=SPACE NEEDED TO LEFT, PR=SPACE NEEDED TO RIGHT, RR3=POS. OF ITEM
26800		KX=RR4/1000.
26900		IF(KX.LE.0.)GO TO 40
27000		PL=3.2
27100	C  ADD A LITTLE SPACE IN FRONT OF DBL BAR.
27200		IF(KX.EQ.2.OR.KX.EQ.4)PR=6.0
27300	C KX=2=DOTS TO RIGHT
27400		IF(KX.GT.2)PL=4.2
27500	C KX>2=DOTS TO LEFT
27600	CC	IF(RL.LT.3)GO TO 700
27700	C JUMP IF THIN DBL BAR. OLD DBL BAR HAS 1 IN R5.
27800	CC229	IF(KX.NE.2)PR=PR+PR
27900	C 2=DOTS TO RT. 1 OR 4=DOTS TO LFT. 3=DOTS ON BOTH SIDES.
28000	C  REPT BAR WITH DOTS TO LEFT.  ADD SPACE IN FRONT OF IT.
28100	CC	PL=-PL/RBX
28200	CC	IF(KX.EQ.4)KX=0
28300	CC129	IF(KX.GE.2)PL=RBZ*PL
28400	C  IF DOTS TO RIGHT ADD MORE SPACE AFTER REPT BAR.
28500		GO TO 42
28600	40	Z=999.
28700	C FIND NEXT CLOSEST ITEM.
28800		DO 41 M=1,NN
28900		J=NP(M)
29000		IF(R2.LE.RJLP.AND.R2.NE.RN(J+2))GO TO 41
29100	C SKIP IF NOT ON RIGHT STAFF
29200		X=RN(J+3)
29300		IF(X.GT.Z.OR.X.LE.RR3)GO TO 41
29400		Z=RR3
29500		L=J
29600	C SAVE POS. AND CODE NUM.
29700	41	CONTINUE
29800		IF(RN(L+1).LE.2.0)PR=PR+BARR
29900	C IF A NOTE OR REST, ADD 1.5 TO SPACE
30000	
30100	42	RR4=AMOD(RR4,100.0)
30200	C FIND HOW MANY STAVES UP THE BAR GOES
30300		IF(RR4.EQ.0)RR4=1.0
30400		RR4=RR4+RR2
30500	43	CALL ROOM(RR3,PL,PR,RR2,R4,R5,RSTFAC)
30600	C    RR3=POS.,PL=NEED TO LEFT,PR=NEED TO RIGHT, RR2=STAFF#
30700		RR2=RR2+1.0
30800	C RESERVE SPACE FOR BAR LINE ON EVERY STAFF COVERED.
30900		IF(RR2.LT.RR4)GO TO 43
31000		GO TO 200
31100	
31200	C KSIG  
31300	17	RR5=ABS(RR5)
31400		IF(RR5.GE.100)RR5=RR5-100
31500	C  +100 FOR NATURALS AS KEYSIG.
31600		PR=SIGR+SIG*(RR5-1)
31700	C  SPACES FOR CORRECT NUM OF ACCIS.  RR5=NUM OF ACCIS.
31800		PL=SIGL
31900		IF(K+1.GT.NN)GO TO 700
32000	C WHAT FOLLOWS KSIG?
32100		KK=NP(K+1)
32200		IF(RN(KK+2).NE.RR2)GO TO 700
32300		IF(RN(KK+1).LE.2.0)PR=PR+SIGN
32400	C FIND NOTE OR REST  ADD VALUE OF SIG_N TO PR 
32500		GO TO 700
32600	
32700	C METER
32800	18	RC=0
32900		IF(RL.GE.7)RC=9
33000	C FOR COMPOSITE METERS. NO CHECK FOR DBL DIGITS YET.
33100		PR=TSR
33200		PL=TSL
33300		IF(RR6.LE.9.AND.RR5.LE.9)GO TO 180
33400	C  CHECKS FOR 2-DIGIT METERS
33500		PR=TTSR
33600		PL=TTSL
33700	180	PR=PR+RC
33800	700	CALL ROOM(RR3,PL,PR,RR2,R4,R5,RSTFAC)
33900	C    RR3=POS.,PL=NEED TO LEFT,PR=NEED TO RIGHT, RR2=STAFF#
34000	200	CONTINUE
34100		CALL JSPACE(NO,R2,R4,R5,RN)
34200	300	END
34300	
34400		SUBROUTINE ROOM(RB,RL,RR,STAF,R4,R5,RSTFAC)
34500	C SETS UP ARRAYS CONTAINING ALL NEEDED SPACE INFO
34600		COMMON /JST/ N,P(400),PL(400),PS(400),NP(400),PR(400)
34700	CC	COMMON/RINP/PS(250),NP(250),NQ(400),PR(250)
34800	CC	COMMON /JST/ N,P(250),PL(250)
34900	C SHARE THESE ARRAYS WITH SOME OTHERS??? (RINP?)
35000		DIMENSION RSTFAC(0/1)
35100		P(N)=0
35200		PL(N)=0
35300		PR(N)=0
35400		PS(N)=-1
35500	C ZERO OUT NEXT ARRAY SLOTS
35600		IF(ABS(RB-R4).LE.0.1)RL=0
35700		IF(ABS(RB-R5).LE.0.1)RR=0
35800	CHECK TO SEE IF ITEM IS AT LEFT OR RIGHT EDGE OF JUSTIFY AREA.
35900		K=STAF
36000		S=RSTFAC(K)
36100	C GET PROPER SIZE FACTOR FOR THIS STAFF
36200		RL=RL*S
36300		RR=RR*S
36400		DO 1 K=1,N-1
36500		IF(ABS(RB-P(K)).GT.0.1)GO TO 1
36600	C SAME POSITION?
36700		IF(RB.LT.P(K))P(K)=RB
36800	C USE POSITION FARTHEST TO LEFT
36900		IF(STAF.NE.PS(K))GO TO 1
37000	C SAME STAFF?
37100		IF(PR(K).LT.RR)PR(K)=RR
37200		IF(PL(K).LT.RL)PL(K)=RL
37300	C ITEM IN SAME POS.  CHANGE SPACE REQUIREMENTS IF NECESSARY.
37400		RETURN
37500	1	CONTINUE
37600		P(N)=RB
37700		PR(N)=RR
37800		PL(N)=RL
37900		PS(N)=STAF
38000		N=N+1
38100	C PUT AWAY MORE SPACE NEEDS.
38200		END
38300	
38400		SUBROUTINE JSPACE(NO,R2,R4,R5,RN)
38500		DIMENSION NO(1),RN(1)
38600		COMMON /JST/ N,P(400),PL(400),PS(400),NP(400),PR(400)
38700	CC	COMMON/RINP/PS(250),NP(250),NQ(400),PR(250)
38800	CC	COMMON /JST/ N,P(250),PL(250)
38900	CC	P(N)=R5
39000	CC	PR(N)=0
39100	CC	PL(N)=0
39200		P(N)=9999.
39300	C LAST POINT IS RIGHT LIMIT OF JUSTIFY AREA
39400	CC	P(N+1)=9999.
39500	   	N=N-1
39600		K=1
39700	2	A=P(K)
39800		M=K+1
39900		KK=K
40000		DO 1 L=M,N
40100		B=ABS(P(L)-A)
40200		IF(B.GT.0.1)GO TO 6
40300		P(L)=A
40400	C SAME POS.
40500		GO TO 1
40600	6	IF(P(L).GT.A)GO TO 1
40700	C FIND ITEM FURTHEST TO LEFT
40800		A=P(L)
40900		K=L
41000	1	CONTINUE
41100	10	IF(K.EQ.KK)GO TO 3
41200		B=PR(K)
41300		C=PL(K)
41400		D=PS(K)
41500		DO 4 L=K,KK+1,-1
41600	C SHUFFLE ARRAYS
41700		LL=L-1
41800		P(L)=P(LL)
41900		PL(L)=PL(LL)
42000		PR(L)=PR(LL)
42100	4	PS(L)=PS(LL)
42200	11	P(KK)=A
42300		PR(KK)=B
42400		PL(KK)=C
42500		PS(KK)=D
42600	3	K=KK+1
42700		IF(K.LE.N)GO TO 2
42800	
42900	C NOW COLLECT ALL SPACE IN PL ARRAY
43000		DO 20 K=2,N+1
43100		L=K-1
43200		IF(PS(K).NE.PS(L))GO TO 21
43300	C SAME STAFF?
43400		GO TO 23
43500	21	L=K-2
43600	22	IF(PS(L).EQ.PS(K))GO TO 23
43700		L=L-1
43800		IF(L.GT.0)GO TO 22
43900		GO TO 20
44000	23	PL(K)=PL(K)+PR(L)
44100	C FOUND PREVIOUS ITEM ON SAME STAFF.
44200	20	CONTINUE
44300	
44400	C NOW STORE POS  OF EACH PREV. ITEM ON SAME STAFF IN PR ARRAY.
44500		DO 40 K=2,N+1
44600		L=K-1
44700		IF(PS(K).NE.PS(L))GO TO 41
44800	C SAME STAFF?
44900		GO TO 43
45000	41	L=K-2
45100	42	IF(L.LE.0)GO TO 44
45200		IF(PS(L).EQ.PS(K))GO TO 43
45300		L=L-1
45400		IF(L.GT.0)GO TO 42
45500	44	PR(K)=R4
45600	C FAR LEFT POS. OF JUST. RANGE GOES INTO PR
45700	7	GO TO 40
45800	43	PR(K)=P(L)
45900	C FOUND PREVIOUS ITEM ON SAME STAFF.
46000	C STORE POS. OF PREVIOUS ITEM IN PR ARRAY.
46100	40	CONTINUE
46200		PR(1)=R4
46300	
46400	C NOW GET RID OF UNNEEDED DATA
46500		L=2
46600	30	LL=L-1
46700		IF(P(L).NE.P(LL))GO TO 36
46800	C NOW 2 ITEMS IN SAME POS. ON DIFF. STAVES
46900		IF(PR(L).EQ.PR(LL))GO TO 34
47000	C JUMP IF POS. OF PREV. ITEM IS SAME IN BOTH CASES.
47100		A=P(L)-PR(L)-PL(L)
47200		B=P(LL)-PR(LL)-PL(LL)
47300	C A,B = EXCESS SPACE AVAILABLE., KEEP THE ONE WITH THE LEAST.
47400		IF(B.GT.A)L=L-1
47500		GO TO 35
47600	34	IF(PL(L).GT.PL(LL))PL(LL)=PL(L)
47700	C EXCHANGE IF NEEDED SPACE HERE IS < PREVIOUS NEEDED
47800	35	N=N-1
47900	C DECREMENT COUNTER
48000	33	DO 32 K=L,N
48100	C CONTRACT ARRAY
48200		M=K+1
48300		PL(K)=PL(M)
48400		PR(K)=PR(M)
48500	32	P(K)=P(M)
48600		GO TO 9
48700	36	L=L+1
48800	9	IF(L.LE.N)GO TO 30
48900	 
49000	100	DO 101 K=1,N
49100	101	PS(K)=P(K)
49200	C PS WILL HOLD SHIFTED POINTS
49300	99	FORMAT('+',I2,1X,$)
49400	98	FORMAT(' ',$)
49500		TYPE 98
49600		DO 50 J=1,40
49700	C "ACCORDIAN" LOOP - USUALLY EXITS WELL BEFORE 40
49800		Y=0
49900		TYPE 99,J
50000		DO 51 K=2,N
50100		A=PS(K)-PR(K)-PL(K)
50200	C NEG. MOVE REQUIREMENT
50300		IF(A.GE.-0.1)GO TO 51
50400	C SKIP IF ENOUGH SPACE
50500		Y=PS(K)
50600	C SHIFT ALL POINTS FOUND FROM HERE TO FAR RIGHT
50700		DO 52 L=K,N
50800		PS(L)=PS(L)-A
50900	52	IF(PR(L).GE.Y)PR(L)=PR(L)-A
51000		IF(PR(K).EQ.PS(K-1))GO TO 51
51100	C JUMP IF PREVIOUS ITEM ON SAME STAFF
51200	C NOW SHIFT OTHER STAVES' ITEMS FOUND TO LEFT
51300		Z=PR(K)
51400		F=Y-PR(K)
51500	C LOOK IN AREA BOUNDED BY Z AND Y
51600		F=(Y-Z-A)/(Y-Z)
51700	C SPACING FACTOR
51800		DO 53 L=1,N
51900		B=PS(L)
52000		IF(B.LT.Z.OR.B.GT.Y)GO TO 54
52100	C FOUND A POINT TO SHIFT
52200		B=B-Z
52300	C ACTUAL SPACE FROM LEFT LIMIT
52400		PS(L)=Z+B*F
52500	C LEFT LIMIT+SPACE*FACTOR
52600	54	B=PR(L)
52700		IF(B.LT.Z.OR.B.GT.Y)GO TO 53
52800		B=B-Z
52900		PR(L)=Z+B*F
53000	53	CONTINUE
53100	51	CONTINUE
53200		IF(PS(N).LE.R5)GO TO 203
53300	C MORE THAN ENOUGH SPACE EXISTS
53400	        IF(Y.EQ.0)GO TO 203
53500	C JUMP OUT IF NO POINTS MOVED
53600	      F=(R5-R4)/(PS(N)-R4)
53700	C FACTOR TO SHIFT ALL BACK WITHIN ORIGINAL LIMITS
53800		Z=R4-R4*F
53900	        DO 56 K=1,N
54000		PS(K)=Z+PS(K)*F
54100	56	PR(K)=Z+PR(K)*F
54200	CC        PS(K)=R4+(PS(K)-R4)*F
54300	CC56      PR(K)=R4+(PR(K)-R4)*F
54400	50    CONTINUE
54500	
54600	CQ NEXT WAS ATTEMPT TO REPLACE "ACCORDIAN" SYSTEM 3/83  (LABELS 101+1→50)
54700	CQ	GO TO 203
54800	CQ        DIMENSION PSX(300),PRR(300),PG(300)
54900	C GET NUM OF STAFF TO JUSTIFY
55000	CQ        DO 60 K=1,N
55100	C SAVE ALL DATA
55200	CQ        PSX(K)=PS(K)
55300	CQ        PRR(K)=PR(K)
55400	CQ60      PG(K)=PS(K)-PR(K)-PL(K)
55500	C PG ARRAY HAS VALUE OF ALL GAPS.
55600	CQ        J=0
55700	CQ61      T=0
55800	C T=TOTAL GAP SPACE AVAILABLE
55900	CQ        DO 62 K=1,N
56000	CQ        IF(PG(K).LE.0)GO TO 62
56100	C SKIP IF NO GAP IN FRONT OF THIS ITEM
56200	CQ        A=PR(K)
56300	C POS. OF PREVIOUS ITEM ON THAT STAFF
56400	CQ        B=PS(K)
56500	C POS OF THIS ITEM
56600	CQ        G=PG(K)
56700	C ADJUSTED GAP SIZE AVAILABLE
56800	CQ	IF(R2.LT.RJLP)GO TO 66
56900	CQ        GG=0
57000	CQ        DO 63 L=K+1,N
57100	C CHECK FOR K+1 > N
57200	CQ        IF(PS(L).LE.A.OR.PR(L).GE.B)GO TO 63
57300	C JUMP IF ITEM IS TO LEFT OF ITEM K OR PREV. IS TO RIGHT
57400	CQ        IF(PG(L).LE.0)GO TO 63
57500	C JUMP IF NO GAP HERE
57600	CQ        GG=PG(L)
57700	CQ	IF(PS(L)-GG.LT.PS(L-1))GG=PS(L)-PS(L-1)
57800	C GAP CAN BE NO GREATER THAN DIST TO PREV. ITEM ON OTHER STAFF
57900	CQ        IF(GG.LT.G)G=GG
58000	C FIND SMALLEST GAP
58100	CQ63      CONTINUE
58200	CQ        IF(GG.EQ.0)GO TO 62
58300	C JUMP IF NO GAPS WITHIN PROPER BOUNDS ARE FOUND
58400	CQ66      T=T+G
58500	C ADD UP TOTAL GAP SPACE
58600	CQ        DO 64 L=K,N
58700	C NOW SHIFT ALL ITEMS TO LEFT TO FILL IN SMALLEST GAP
58800	CQ        PS(L)=PS(L)-G
58900	CQ        IF(PR(L).GE.B)GO TO 65
59000	C SKIP IF PREV. ITEM IS OUT OF BOUNDS TO RIGHT
59100	CQ        PG(L)=PG(L)-G
59200	C DECREASE THE GAP SIZES
59300	CQ        GO TO 64
59400	CQ65      PR(L)=PR(L)-G
59500	C MOVE BACK POS. OF PREV. ITEM IF IN BOUNDS
59600	CQ64      CONTINUE
59700	CQ62      CONTINUE
59800	CQ        IF(J.NE.0)GO TO 203
59900	C J=-1 SECOND TIME THROUGH LOOP.
60000	CQ        IF(T.EQ.0)GO TO 70
60100	C JUMP IF NO FREE SPACE WAS FOUND
60200	CQ        X=(PSX(N)-R5)/T
60300	C EXTRA SPACE REDUCTION FACTOR
60400	CQ        IF(X.LT.1.0)GO TO 71
60500	C JUMP IF NOT ENOUGH ROOM WAS FOUND, USE PS AS IS.
60600	CQ70      X=(R5-R4)/(PS(N)-R4)
60700	C SHIFT ALL POINTS BY THIS FACTOR
60800	CQ        DO 75 L=1,N
60900	CQ        PS(L)=R4+(PS(L)-R4)*X
61000	CQ75      PR(L)=R4+(PR(L)-R4)*X
61100	CQ        GO TO 203
61200	CQ71      DO 72 L=1,N
61300	C GET BACK ORIGINAL DATA AND GO THRU LOOP AGAIN WITH FACTOR
61400	CQ        PS(L)=PSX(L)
61500	CQ        PR(L)=PRR(L)
61600	CQ72      PG(L)=(PS(L)-PR(L)-PL(L))*X
61700	CQ        J=-1
61800	CQ        GO TO 61
61900	
62000	C NOW PS(1) SHOULD BE >=R4, PS(N)<=R5.
62100	203	CALL MOVIT(RN,NO,0.0,2000.0,1000.0,0.0)
62200	C  MOVE EVERYTHING 1000 TO RIGHT
62300	CCC203	CALL MOVIT(RN,NO,R5,2000.0,1000.0,0.0)
62400	C MOVE ANYTHING TO RIGHT OF JUSTIFY AREA FAR TO RIGHT.
62500	CC CAN'T USE DO LOOP, FAIL PROG. WIPES OUT AC15.	DO 206 K=1,N
62600	CC	CALL MOVIT(RN,NO,R4,R5,500.0,0.0)
62700	C NOW MOVE JUSTIFY AREA 500 TO RIGHT. LEAVES ROOM FOR EXPANSION, CONTRACTION.
62800		K=2
62900		L=1
63000	C A= AMOUNT MOVED LEFT OR RIGHT.
63100	206	CALL MOVIT(RN,NO,P(L)+1000.0,P(K)+1000.0,PS(L),PS(K))
63200	C MOVE OLD RANGE INTO NEW RANGE (AND SHIFT BACK 1000)
63300		L=K
63400		K=K+1
63500		IF(K.LE.N)GO TO 206
63600		CALL MOVIT(RN,NO,1000.0,3000.0,-1000.0,0.0)
63700	CCC	CALL MOVIT(RN,NO,R5+1000.0,3000.0,-1000.0,0.0)
63800	C MOVE BACK THINGS TO RIGHT OF JUSTIFY AREA.  NOW ALL DONE.
63900	300	END